#ifndef CMANAGERFILE_H_
#define CMANAGERFILE_H_
#include <unistd.h>
#include <iostream>
#include <map>
#include <list>
#include <fstream>
#include "tipos.h"
#include "CManagerSpace.h"
#include "CManagerTag.h"


class CManagerFile
{
	/*
	 * Estructura del archivo 
	 * [Flag Borrado/Valido | ID Palabra | #Tags | SFrecTag1...| SFrecTagn]
	 */
private:
	
	bool reorganizar;
	
	DBFrecuencias::MaxFileSize maxSize; // en bytes
	
	CManagerTag* managerTag;
	
	std::fstream stream;
	
	CManagerSpace* space;
	
	DBFrecuencias::IndiceArchivo indice;

	void cargarIndiceRegistros();
	
	void guardarIndiceRegistros();
	
	void copiarRegistro(const DBFrecuencias::Offset origen,const DBFrecuencias::Offset destino);
	
	CManagerFile(const CManagerFile& c);
	
public:
	
	CManagerFile(DBFrecuencias::MaxFileSize size = TAMANIO_MEMORIA);

	void eliminarRegistro(DBFrecuencias::Palabra id);
	
	//void insertarRegistro(DBFrecuencias::PalabraId id, DBFrecuencias::TagId tagId, DBFrecuencias::Frecuencia frec);
	
	void incrementarFrecuencia(DBFrecuencias::Palabra id, DBFrecuencias::TagId tagId, DBFrecuencias::Frecuencia frec);
	
	void decrementarFrecuencia(DBFrecuencias::Palabra id, DBFrecuencias::TagId tagId, DBFrecuencias::Frecuencia frec);
	
	void reindexar();
	
	void consultarFrecuencias(DBFrecuencias::Palabra id,DBFrecuencias::MapFrecuencias& vector);
	
	//elimina un tagiD | frec
	void truncarRegistro(DBFrecuencias::Offset origen, DBFrecuencias::Offset destino, DBFrecuencias::TagId tagId );
	
	void setTagManager(CManagerTag* manager);
	
	CManagerTag* getTagManager() { return this->managerTag; }
	
	void eliminarTag(DBFrecuencias::TagId tagId);

	void reorganizarArchivo();
	
	virtual ~CManagerFile();
};

#endif /*CMANAGERFILE_H_*/
